package com.sias.reflection;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author 吴文杰
 * @version 1.0
 * @createTime 2023-05-02 12:36:54
 */
@SuppressWarnings("all")
public class Reflection01 {
  public static void main(String[] args) throws Exception {

    Properties properties = new Properties();
    properties.load(new FileInputStream("reflection/src/main/resources/re.properties"));
    String classfullpath = properties.get("classfullpath").toString();
    String methodName = properties.get("method").toString();
    //通过类全限定名加载类，获得Class类型的对象
    Class<?> cls = Class.forName(classfullpath);
    //通过cls得到加载的类com.sias.Cat的对象实例
    Object cat = cls.newInstance();
    //运行类型为com.sias.Cat
    System.out.println(cat.getClass());

    /**
     * Method对象
     */
    //通过方法名来，从cls获得加载的类com.sias.Cat的方法123123123
    Method clsMethod = cls.getMethod(methodName);
    //通过方法对象来实现调用方法
    clsMethod.invoke(cat);//传统 对象.方法()  反射：方法对象.invoke(对象)


    /**
     * Filed对象
     */
    //getField()不能得到私有属性
    Field nameFiled = cls.getField("age");
    System.out.println(nameFiled.get(cat)); //传统 对象.成员变量  反射：成员变量对象.get(对象)

    /**
     * Constructor对象
     */
    Constructor<?> constructor = cls.getConstructor();
    System.out.println(constructor.getName());//传统 new 对象()  反射：构造器对象.getName()
    Constructor<?> allArgsConstructor = cls.getConstructor(String.class, Integer.class);
    System.out.println(allArgsConstructor.getName());
  }
}
